﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PuzzleControl : MonoBehaviour
{
    public enum PuzzleState
    {
        Standby,
        Start,
        Move,
        End
    };  // 列舉轉珠時的狀態，分別為待機(Standby)、開始點擊(Start)、移動中(Move)、轉珠結束(End)
    public PuzzleState state;   // 储存当前的转珠状态
    public RectTransform BGRect;// 背景物件的RectTransform，這裡用來做滑鼠點擊位置轉換到UI位置的基準
    public RectTransform fingerRect;    // Finger物件的RectTransform
    public Finger finger;   // Finger物件的腳本
    public float puzzleTime = 4;// 转珠时间
    public float timer = 0; // 轉珠過程的計時器
    public Text stateText;  // 顯示轉珠狀態的文字
    public Text timerText;  // 顯示剩餘秒數的文字

    Vector2 WorldToRect()   // 將滑鼠點擊位置轉換成UI位置的函式，會回傳一個Vector2數值
    {
        Vector2 screenPoint = RectTransformUtility.WorldToScreenPoint(Camera.main, Input.mousePosition);
        Vector2 Pos;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(BGRect, screenPoint, Camera.main, out Pos);
        return Pos;
    }

    // 個狀態的控制函式
    void StandbyControl() 
    {
        if (Input.GetMouseButtonDown(0))    // 當滑鼠左鍵按下時
        {
            Vector2 fingerPos = WorldToRect();  // 儲存轉換的點擊位置
            if (fingerPos.x < BGRect.sizeDelta.x && fingerPos.x > 0
                && fingerPos.y < BGRect.sizeDelta.y && fingerPos.y > 0) // 當點擊的範圍在下方轉珠的區塊時
                state = PuzzleState.Start;  // 把轉珠狀態切換成開始點擊(Start)
        }
    }

    void StartControl() 
    {
        if (Input.GetMouseButton(0))    // 當點著滑鼠左鍵時改變finger物件位置
        {
            Vector2 fingerPos = WorldToRect();  // 儲存轉換的點擊位置
            fingerRect.anchoredPosition = new Vector2(Mathf.Clamp(fingerPos.x, 0, BGRect.sizeDelta.x),
                          Mathf.Clamp(fingerPos.y, 0, BGRect.sizeDelta.y)); // 將移動範圍限制在下方的轉珠區塊並帶入finger物件位置
            if (finger.moveState)   // 當finger開始移動時，把轉珠狀態切換成移動
                state = PuzzleState.Move;
        }
        else if (Input.GetMouseButtonUp(0)) // 當放開滑鼠左鍵時
        {
            GameObject.Find("PuzzleSystem").GetComponent<PuzzleSystem>().runes[finger.nowRune.number].GetComponent<Image>().color = Color.white;    // 將當前點擊的珠子顯示顏色修改回來
            finger.FingerInit();    // 初始化finger物件數值
            state = PuzzleState.Standby;    // 將轉珠狀態設回待機
        }
    }
    
    void MoveControl()
    {
        // 與StartControl相同，點擊時改變finger物件位置
        if (Input.GetMouseButton(0))
        {
            Vector2 fingerPos = WorldToRect();
            fingerRect.anchoredPosition = new Vector2(Mathf.Clamp(fingerPos.x, 0, BGRect.sizeDelta.x),
                          Mathf.Clamp(fingerPos.y, 0, BGRect.sizeDelta.y));
        }
        // 滑鼠放開時做finger初始化等等動作，轉珠狀態切換為結束(End)
        else if (Input.GetMouseButtonUp(0))
        {
            GameObject.Find("PuzzleSystem").GetComponent<PuzzleSystem>().runes[finger.nowRune.number].GetComponent<Image>().color = Color.white;
            finger.FingerInit();
            state = PuzzleState.End;
        }
        // 除了滑鼠方開外，還要做計時並判斷是否超時的動作，超時同樣要切換成結束狀態
        timer += Time.deltaTime;
        if (timer >= puzzleTime)
        {
            GameObject.Find("PuzzleSystem").GetComponent<PuzzleSystem>().runes[finger.nowRune.number].GetComponent<Image>().color = Color.white;
            finger.FingerInit();
            state = PuzzleState.End;
            timer = 0;
        }
    }
    
    void EndControl()
    {
        // 做Part.2到Part.4的內容，轉珠系統的本體就完成的差不多了
    }

    private void Start()
    {
        state = PuzzleState.Standby;    // 轉珠狀態初始化為待機
    }

    void Update()
    {
        // 顯示文字
        stateText.text = "State: " + state;
        timerText.text = "Time: " + (puzzleTime - timer) + "s";
        // 依state數值執行狀態函式
        switch (state)
        {
            case PuzzleState.Standby:
                StandbyControl();
                break;
            case PuzzleState.Start:
                StartControl();
                break;
            case PuzzleState.Move:
                MoveControl();
                break;
            case PuzzleState.End:
                EndControl();
                break;
        }
    }
}
